package compilador.geradorcodigo;

/**
 * Possui métodos para auxílio, construção e controle da geração de código C a
 * partir de um arquivo na linguagem LA.
 *
 * @author Lucas S Bueno
 */
public class GeradorCodigo {

    private StringBuilder codigo; //variável utilizada para montar o código em C na memória
    public static final String TAMANHO_LITERAL = "[80]"; //constante para o tamanho máximo de um vetor de chars (string em C)

    /**
     * Construtor da classe GeradorCodigo. Inicializa o código a ser montado com
     * uma String vazia.
     */
    public GeradorCodigo() {
        codigo = new StringBuilder();
    }

    /**
     * Método de montagem da String do código C.
     *
     * @param cadeia Uma sequência de chars que será inserida ao final do código
     * sendo montado utilizando o método append da classe StringBuilder.
     */
    public void insereCodigo(CharSequence cadeia) {
        codigo.append(cadeia);
    }

    /**
     * Retorna o código montado até o momento como uma String
     */
    public String getCodigo() {
        return codigo.toString();
    }

    /**
     * Converte um tipo básico da linguagem LA para um tipo básico da linguagem
     * C correspondente. Se a chamada tiver o parâmetro printf como true, então
     * retorna um tipo correspondente para formação da função printf (%d, %f,
     * %s, ...)
     */
    public static String converteTipo(String codigoLA, boolean printf) {
        String codigoC;

        if (codigoLA.equals("inteiro")) {
            if (printf) {
                codigoC = "%d";
            } else {
                codigoC = "int";
            }
        } else if (codigoLA.equals("real")) {
            if (printf) {
                codigoC = "%f";
            } else {
                codigoC = "float";
            }
        } else if (codigoLA.equals("logico")) {
            if (printf) {
                codigoC = "%d";
            } else {
                codigoC = "int";
            }
        } else if (codigoLA.equals("literal")) {
            if (printf) {
                codigoC = "%s";
            } else {
                codigoC = "char";
            }
        } else {
            codigoC = codigoLA;
        }

        return codigoC;
    }

    /**
     * Converte um operador da linguagem LA para um operador da linguagem C.
     * Exemplos: e -> &&, ou -> ||, nao -> !, ...
     */
    public static String converteOperador(String operadorLA) {
        String operadorC;

        if (operadorLA.equals("verdadeiro")) {
            operadorC = "1";
        } else if (operadorLA.equals("falso")) {
            operadorC = "0";
        } else if (operadorLA.equals("e")) {
            operadorC = "&&";
        } else if (operadorLA.equals("ou")) {
            operadorC = "||";
        } else if (operadorLA.equals("nao")) {
            operadorC = "!";
        } else if (operadorLA.equals("<>")) {
            operadorC = "!=";
        } else if (operadorLA.equals("<-")) {
            operadorC = "=";
        } else if (operadorLA.equals("=")) {
            operadorC = "==";
        } else {
            operadorC = operadorLA;
        }

        return operadorC;
    }
}
